/*
 * @Description: 
 * @Author: rendc
 * @Date: 2024-10-17 10:42:45
 * @LastEditors: rendc
 * @LastEditTime: 2024-10-17 11:32:49
 */

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

/**
 * Test03Server
 */
public class Test03Server {

  public static void main(String[] args) throws Exception {
    // 1.搭建TCP服务器
    // String ip = "127.0.0.1";
    // String ip = "localhost";
    int port = 8002;
    ServerSocket server = new ServerSocket(port);
    System.out.println("服务器：启动成功");
    // 2.接收客户端的连接
    // server.accept()
    // 1. 获取到了客户端的连接 会返回一个 Socket 对象
    // 2. 没有获取到客户端连接 阻塞一直等待
    Socket client = server.accept();
    System.out.println("服务器：客户端连接成功" + client);
    // 3.读取客户端传递的Teacher集合并遍历
    // 3.1 获取输入流并封装成对象流
    ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
    // 3.2 读取集合对象
    @SuppressWarnings("unchecked")
    // 忽略泛型安全检查 - 程序员自己要保证传来的类是安全的
    List<Teacher> list = (List<Teacher>) ois.readObject();
    // 3.3 遍历
    for (Teacher teacher : list) {
      System.out.println("服务器：接收到的数据" + teacher);
    }
    // 4.将集合对象(含所有老师信息)写入本地文件t.txt，txt文件位置 ./t.txt
    // 4.1 定义文件输出流并封装成对象流
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("t.txt"));
    // 4.2 向t.txt文件中写入数据
    oos.writeObject(list);
    System.out.println("服务器：成功写入文件");
    // 5.返回响应信息给客户端
    // 5.1 获取输出流并封装成缓冲流
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    // 5.2 返回ok信息给客户端
    bw.write("ok");
    bw.newLine(); // 写入一个空行 确保信息发送成功
    // 6.关闭资源
    bw.close();
    oos.close();
    ois.close();
    client.close();
    server.close();
    System.out.println("服务器：已关闭");
  }
}